/**
 * 输入参数标注
 * 
 * 
    function greet(name: string) {
      console.log("Hello, " + name.toUpperCase() + "!!");
    }

    greet("hello"); // OK
    greet(42); // Error 类型“number”的参数不能赋给类型“string”的参数。
 */

/**
 * 可选参数
 *
 *    通过在 参数名称后面写一个 ? 号，表示该参数可选。
 *    这时 name 的类型为 string | undefined 的一个联合类型
 * 
      function greet(name?: string) {
        // 这时 name 的类型是  string | undefined
        name?.toUpperCase()
      }

      greet("hello"); // OK
      greet(); // OK
      greet(42); // Error 类型“number”的参数不能赋给类型“string”的参数
 */

/**
 * 返回值类型的标注
 *
 *    1. void 表示没有返回值
 * 
      function getFavoriteNumber(): number {
        // return 26; // OK
        return "hello"; // Error 不能将类型“string”分配给类型“number”。
      }
 */

/**
 * 匿名函数的自动类型推导
 * 
      const names = ["Alice", "Bob", "Eve"];

      names.forEach(function (s) {
        console.log(s.toUppercase()); // Error 属性“toUppercase”在类型“string”上不存在。你是否指的是“toUpperCase”?
      });

      names.forEach((s) => {
        console.log(s.toUppercase()); // Error 属性“toUppercase”在类型“string”上不存在。你是否指的是“toUpperCase”?
      });
 */
